/**********************
 * 模拟红绿灯场景，当没有人通过时，人行道亮红灯，禁止通行，汽车可以通行；
 *               当人需要通过时，按下通行按钮，此时车不能通行，红灯亮，人可以通行，
 *               3秒后，人通行完毕，自动切换到车通行
 *         author: tiaya@qq.com
 *         (本程序参照学习强国 arduino教程编写，并适当改动)
 *         视频教程地址：https://www.xuexi.cn/lgpage/detail/index.html?id=3950395216274864447
 */
 const int Rred = 6;   //机动车红灯
const int Ryel = 5;   //机动车黄灯
const int Rgreen = 4; //机动车绿灯

const int Pred = 2;    //人行道红灯
const int Pgreen = 3;  //人行道绿灯


const int Butt = 10; //按键

int state = 0;   //按键状态，0-没按下，1-按下

//init
void setup() {
    //2-6号灯为输出模式
    for(int i=2; i<=6;i++) {
        pinMode(i, OUTPUT);  
    }
    //10号灯位输入模式
    pinMode(Butt, INPUT);
    Serial.begin(9600);   //串口输出
}

void loop() {
    //获取按钮状态
    state = digitalRead(Butt);   //读取按钮状态
    //delay(30);
    Serial.println(state);       //输出按键状态0-1

    if(state == 1) {
        delay(5);  //防抖处理，两侧间隔5-10毫秒按下，说明确实有按下
        //有人按下按钮要通行
        if(state == 1) {
            digitalWrite(Rgreen, LOW);  //车 绿灯灭
            
            digitalWrite(Ryel, HIGH);   //车 黄灯闪烁
            delay(300);
            digitalWrite(Ryel, LOW);
            delay(300);
            digitalWrite(Ryel, HIGH);   //车 黄灯闪烁
            delay(300);
            digitalWrite(Ryel, LOW);
           
            digitalWrite(Rred, HIGH);   //车 红灯亮，禁止车通行
    
            digitalWrite(Pred, LOW);    //人 红灯灭
            digitalWrite(Pgreen, HIGH); //人 绿灯亮（可通行）
            delay(3000);     //3s 等待3秒，实际应用中可能是3分钟
        }
    } else {
        delay(10);       //防抖处理，两侧间隔5-10毫秒没有按下，说明确实没有按下
        if(state == 0) {
            //没有行人通过时
            digitalWrite(Rgreen, HIGH);//车 绿灯亮（通行）
            digitalWrite(Ryel, LOW);   //车 黄灯灭
            digitalWrite(Rred, LOW);   //车 红灯灭
    
            digitalWrite(Pred, HIGH);  //人 红灯亮
            digitalWrite(Pgreen, LOW); //人 绿灯灭（禁止通行）
        }
    }
}
